$(function () {

    // ------some Tool functions (pure function)

    var user = $("#userUser").val();

    function isThisMan(name) {
        // var user = $("#userUser").val();
        return user ? (user === name) : false;
    }

    //Warning: dataBase's data is too many items, some(e.g _id) will cover fullCalendar's item,
    //and cause to 'removeEvents' can't run completely'
    //and convert 'id'(int) to (string)
    function toTidy(data, items) {

        // var now = calendar.fullCalendar('getDate');
        // var today = calendar.fullCalendar('today');

        // var now = moment(Date());
        var now = moment();

        console.log('moment: ' + moment);

        items = items || ['id', 'title', 'allDay', 'start', 'end', 'room_id', 'user', 'status'];
        var tidy = [];

        data.forEach(function (element, index) {
            tidy[index] = {};
            items.forEach(function (item) {
                tidy[index][item] = element[item];

                if (item == 'status') {
                    var end = moment.unix(element['end']);
                    //使每个预约以不同的颜色显示， 1， 2， 3 , 4
                    if (now > end) {
                        tidy[index]['color'] = colorStatus[3].color;
                        // <del>helloworld</del>
                        //     tidy[index]['title'] = '<del>' + tidy[index]['title'] + '</del>';
                    } else {
                        tidy[index]['color'] = colorStatus[Number(element[item]) - 1].color;
                    }
                }

                if (item == 'start') {
                    var start = moment.unix(element[item]);
                    tidy[index][item] = start.format();
                }

                if (item == 'end') {
                    var end = moment.unix(element[item]);
                    tidy[index][item] = end.format();
                }
            })
        });

        return tidy;
    }

    function toSerialize(data) {
        var str = '';
        for (var index in data) {
            str = str + index + '=' + data[index].val() + '&';
        }
        return str;
    }

    function getDataJquery(parent, items) {
        items = items || ['id', 'start', 'end', 'room_id', 'user', 'title'];
        var template = ["[name=", , "]"];
        var condition;
        var data = {};

        items.forEach(function (element) {
            template[1] = element;
            condition = template.join('');
            data[element] = $(parent).find(condition);
        });

        return data;
    }


    // function checkConflict() {
    //     var originalEvents = [];
    //     var deletedEvent = {};
    //
    //     function setOriginalEvents(events) {
    //         originalEvents = events;
    //     }
    //
    //     function getDeletedEvent() {
    //         return deletedEvent;
    //     }
    //
    //     function addOriginalEvent(event) {
    //         originalEvents.push(event);
    //     }
    //
    //     function removeOriginalEvent(id) {
    //         originalEvents.forEach(function (element, index) {
    //             if (Number(element.id) === Number(id)) {
    //                 deletedEvent = originalEvents.splice(index, 1)[0];
    //             }
    //         })
    //     }
    //
    //     function resumeDeletedEvent() {
    //         if (deletedEvent) {
    //             originalEvents.push(deletedEvent);
    //         }
    //     }
    //
    //     function condition(x, y) {
    //         if (x < y) {
    //             return -1;
    //         }
    //         if (x > y) {
    //             return 1
    //         }
    //         return 0;
    //     }
    //
    //     function isTimeConflict(event) {
    //         var eventStart = Number(event.start);
    //         var eventEnd = Number(event.end);
    //         var starts = [];
    //         var ends = [];
    //
    //         starts.push(eventStart);
    //         ends.push(eventEnd);
    //         originalEvents.forEach(function (element) {
    //             if (event.room_id === element.room_id) {
    //                 starts.push(Number(element.start));
    //                 ends.push(Number(element.end));
    //             }
    //         })
    //
    //         starts.sort(condition);
    //         ends.sort(condition);
    //
    //         var indexStart = starts.indexOf(eventStart);
    //         if ((starts[indexStart + 1]) && (starts[indexStart + 1] < eventEnd) && (starts[indexStart + 1] !== eventStart)) {
    //             return true;
    //         }
    //
    //         var indexEnd = ends.indexOf(eventEnd);
    //         if ((indexEnd - 1 >= 0) && (ends[indexEnd - 1] > eventStart) && (ends[indexEnd + 1] !== eventEnd)) {
    //             return true;
    //         }
    //
    //         if ((starts[indexStart + 1] !== eventStart) && (indexStart - 1 === indexEnd)) {
    //             return true;
    //         }
    //
    //         if ((starts[indexStart + 1] === eventStart) && (indexStart === indexEnd)) {
    //             return true;
    //         }
    //
    //         return false;
    //     }
    //
    //     return {
    //         setOriginalEvents: setOriginalEvents,
    //         getDeletedEvent: getDeletedEvent,
    //         addOriginalEvent: addOriginalEvent,
    //         removeOriginalEvent: removeOriginalEvent,
    //         resumeDeletedEvent: resumeDeletedEvent,
    //         isTimeConflict: isTimeConflict
    //     }
    // }


    //------some functions to operate Pop, (These code created by anonymous, So you know them maybe little confused.)

    // function getPopMethods() {
    //
    //     var roomsAvailable = getAvailableRooms(curRoomId);
    //     var options = new strbuf();
    //     options.pushArray('<option value="${id}">${name}</option>', roomsAvailable);
    //
    //     function getConfigure(element, pop, offset) {
    //         var sty = element.offset(), cls = 'bubble-top';
    //         if (!sty) {
    //             sty = {left: jsEvent.pageX, top: jsEvent.pageY};
    //         }
    //         sty.left -= (pop.outerWidth() - element.outerWidth()) / 2;
    //         if (sty.top - pop.outerHeight() - offset > $(document).scrollTop()) {
    //             sty.top -= pop.outerHeight() + offset;
    //         } else {
    //             cls = 'bubble-bottom';
    //             sty.top += element.outerHeight() + offset;
    //         }
    //
    //         return {sty: sty, cls: cls};
    //     }
    //
    //     //关闭
    //     function popClose() {
    //         $('.bubble').remove();
    //     }
    //
    //     //添加预约事件
    //     function popAdd(evt, jsEvent, view) {
    //         popClose(); // close other pops
    //
    //         if (!('id' in evt) && (evt.start.unix() - 480 * 60 < Number(new Date()) / 1000)) {
    //             $.notify('预约时间必须大于当前时间！', 'warn');
    //             calendar.fullCalendar('unselect');
    //             return;
    //         }
    //
    //         var eventData = {
    //             id: evt.id,
    //             title: evt.title,
    //             start: evt.start.unix(),
    //             end: evt.end ? evt.end.unix() : '',
    //             time: $.fullCalendar.formatRange(evt.start, evt.end || evt.start.add(1, 'hour'), 'MMMM D H:mm')
    //         };
    //         var html = strbuf($('#pop_tpl').html(), eventData, '');
    //         var pop = $(html).appendTo(document.body);
    //         var dataJquery = getDataJquery(pop);
    //
    //         //write pop's room_id data
    //         var selectRoom = dataJquery.room_id.html(options.toString());
    //         if (evt.room_id != null && rooms[evt.room_id].deleted) { // deleted room
    //
    //         } else {
    //             selectRoom.val(evt.room_id || roomsAvailable[0].id);
    //         }
    //
    //
    //         //if evt.user is none, it must be created by just now.
    //         if (evt.user && !isThisMan(evt.user)) {
    //             $.notify('你没有修改权限！', 'warn');
    //             pop.find('.information').hide();
    //             pop.find('.btn-danger').hide();
    //             pop.find('.btn-primary').hide();
    //             if (isThisMan('admin')) {
    //                 $.notify('管理员具有删除权限');
    //                 pop.find('.btn-danger').show();
    //             }
    //         }
    //
    //         pop.find('.close').click(function () {
    //             popClose();
    //             calendar.fullCalendar('unselect'); // cancel selected.
    //         });
    //         pop.keydown(function (e) {
    //             if (e.which === 27) {
    //                 pop.find('.close').click();
    //             }
    //         });
    //
    //         pop.find('[name=title]').select();
    //
    //         pop.find('.btn-danger').click(function () {
    //             var id = dataJquery.id.val();
    //             if (id) {
    //                 $.post('reservation-del', {id: id}, function (json) {
    //                     if (json.code === 0) {
    //                         calendar.fullCalendar('removeEvents', id);
    //                         $.notify('删除成功！');
    //                         popClose();
    //                         check.removeOriginalEvent(id);
    //                     } else {
    //                         check.resumeDeletedEvent();
    //                     }
    //                 });
    //             } else {
    //                 $.notify('请先保存！', 'warn');
    //             }
    //             return false;
    //         });
    //
    //         // position
    //         var element = $(jsEvent.target).closest('.fc-event');
    //         var data = getConfigure(element, pop, 12);
    //         pop.addClass(data.cls).css(data.sty);
    //
    //         pop.find('.btn-primary').click(function () {
    //             //prohibit blank title
    //             var titleInput = dataJquery.title;
    //
    //             if (!titleInput.val().length) {
    //                 titleInput.notify('请输入标题！', 'warn');
    //                 titleInput.focus();
    //                 return false;
    //             }
    //
    //             //prohibit new reservation's time conflict
    //             var id = dataJquery.id.val();
    //             if (id) {
    //                 check.removeOriginalEvent(id);
    //             }
    //             var originalevent = {
    //                 start: dataJquery.start.val(),
    //                 end: dataJquery.end.val(),
    //                 room_id: dataJquery.room_id.val()
    //             };
    //             if (check.isTimeConflict(originalevent)) {
    //                 $.notify('与已知预定时间冲突！', 'warn');
    //                 popClose();
    //                 calendar.fullCalendar('unselect'); // cancel selected.
    //
    //                 if (id) {
    //                     check.resumeDeletedEvent();
    //                 }
    //
    //                 return false;
    //             }
    //
    //             $.post('reservation-add', toSerialize(dataJquery), function (json) {
    //                 if (json.code === 0) { //成功
    //                     var myId;
    //                     if (json.data) { // add
    //                         var event = {
    //                             id: json.data,
    //                             title: dataJquery.title.val(),
    //                             room_id: dataJquery.room_id.val(),
    //                             start: dataJquery.start.val(),
    //                             end: dataJquery.end.val()
    //                         };
    //                         calendar.fullCalendar('renderEvent', event);
    //                         calendar.fullCalendar('unselect'); // unselect to update UI.
    //                         myId = json.data;
    //                     } else {
    //                         $.extend(evt, {
    //                             title: dataJquery.title.val(),
    //                             room_id: dataJquery.room_id.val(),
    //                             color: rooms[dataJquery.room_id.val()].color
    //                         });
    //                         calendar.fullCalendar('updateEvent', evt);
    //                         myId = evt.id;
    //                     }
    //
    //                     check.addOriginalEvent({
    //                         id: myId,
    //                         start: dataJquery.start.val(),
    //                         end: dataJquery.end.val(),
    //                         room_id: dataJquery.room_id.val()
    //                     });
    //
    //                     $.notify('保存成功！');
    //                     popClose();
    //                 } else {
    //                     if (id) {
    //                         check.resumeDeletedEvent();
    //                     }
    //                 }
    //             });
    //             return false;
    //         });
    //     };
    //
    //     //更新预约事件
    //     function updateEvent(event, delta, revertFunc) {
    //         var params = {
    //             id: event.id,
    //             start: event.start.unix(),
    //             end: event.end ? event.end.unix() : ''
    //         };
    //         //prohibit new reservation's time conflict
    //         var id = event.id;
    //         check.removeOriginalEvent(id);
    //         var originalevent = {start: event.start.unix(), end: event.end.unix(), room_id: event.room_id};
    //         if (check.isTimeConflict(originalevent)) {
    //             $.notify('与已知预定时间冲突！', 'warn');
    //             popClose();
    //             check.resumeDeletedEvent();
    //
    //             var deletedEvent = check.getDeletedEvent();
    //             var oldStart, oldEnd;
    //             //Greenwich Mean Time，GMT
    //             oldStart = moment.unix(deletedEvent.start - 480 * 60).utcOffset(0).format();
    //             oldEnd = moment.unix(deletedEvent.end - 480 * 60).utcOffset(0).format();
    //
    //             $.extend(event, {
    //                 start: $.fullCalendar.moment(oldStart),
    //                 end: $.fullCalendar.moment(oldEnd)
    //             });
    //             calendar.fullCalendar('updateEvent', event);
    //             return false;
    //         };
    //
    //         $.post('reservation-add', params, function (json) {
    //             if (json.code === 0) {
    //                 $.notify('更新成功！');
    //                 check.addOriginalEvent({
    //                     start: event.start.unix(),
    //                     end: event.end.unix(),
    //                     room_id: event.room_id,
    //                     id: event.id
    //                 });
    //             } else {
    //                 check.resumeDeletedEvent();
    //             }
    //             ;
    //         });
    //     };
    //
    //     //返回方法
    //     return {
    //         popAdd: popAdd,
    //         popClose: popClose,
    //         updateEvent: updateEvent
    //     };
    // };


    function getAvailableRooms(curRoomId) {
        console.log('curRoomId: ', curRoomId);
        var roomsAvailable = [];
        roomsAvailable.push(Rooms[curRoomId - 1]);
        // return rooms;
        // var rooms = getRooms(curRoomId);
        // var roomsAvailable = rooms.filter(function (room) {
        //     return !room.deleted;
        // });
        return roomsAvailable;
    };

    // var getUrlParameter = function getUrlParameter(sParam) {
    //     var sPageURL = decodeURIComponent(window.location.search.substring(1)),
    //         sURLVariables = sPageURL.split('&'),
    //         sParameterName,
    //         i;
    //
    //     for (i = 0; i < sURLVariables.length; i++) {
    //         sParameterName = sURLVariables[i].split('=');
    //
    //         if (sParameterName[0] === sParam) {
    //             return sParameterName[1] === undefined ? true : sParameterName[1];
    //         }
    //     }
    // };

    // var curRoomId = getUrlParameter('roomId');
    // console.log("curRoomId: " + curRoomId);

    curRoomId = $("#room_id").val();

    // var popMethods = getPopMethods();

    // var check = checkConflict();

    // var newEvents ;
    var calendar = $('#calendar').fullCalendar({
        theme: true,
        header: {
            left: 'prev,next today',
            center: 'title',
            right: 'month,agendaWeek,agendaDay,listMonth'
        },
        navLinks: true, // can click day/week names to navigate views
        editable: false,
        eventLimit: true, // allow "more" link when too many events

        //点击跳转到当天
        dayClick: function (date, jsEvent, view) {

            // alert('Clicked on: ' + date.format());

            $(this).css('background-color', '#2F79B9');
            // change the day's background color just for fun

            calendar.fullCalendar('gotoDate', date);
            calendar.fullCalendar('changeView', "agendaDay");

        },
        // eventLimit: true, // allow "more" link when too many events
        // defaultView: 'month',
        // defaultTimedEventDuration: '01:00',
        // allDaySlot: false,
        // scrollTime: '08:00',
        // slotLabelFormat: 'HH:mm',
        businessHours: {
            start: '8:00',
            end: '22:00'
        },
        // locale: 'zh-cn',
        // height: 650,
        eventOverlap: function (stillEvent, movingEvent) {
            return true;
        },

        events: function (start, end, timezone, callback) {
            //默认加载第一会议室列表
            //, start: start.unix(), end: end.unix()

            $.get('/reservation-get', {roomId: curRoomId}, function (json) {
                if (json.code === 0) {
                    // console.log("json: ", json);
                    var newEvents = toTidy(json.data, ['id', 'title', 'allDay', 'start', 'end', 'room_id', 'status']);

                    $.get('/weathers-get', function (weatherList) {
                        weatherList.forEach(function (weather) {
                            if (weather['allDay'] == 'true') {
                                weather['allDay'] = true;
                            } else {
                                weather['allDay'] = false;
                            }
                        });

                        var list = newEvents.concat(weatherList);
                        callback(list);
                    });


                }
            });


        },

        // eventDataTransform: function (eventData) {
        //     if ('room_id' in eventData) {
        //         eventData.start = moment.unix(eventData.start - 0).utcOffset(0).format();
        //         eventData.end && (eventData.end = moment.unix(eventData.end - 0).utcOffset(0).format());
        //         // eventData.color = eventData.room_id && rooms[eventData.room_id].color;
        //     }
        //     return eventData;
        // },
        // eventDrop: popMethods.updateEvent,
        // eventResize: popMethods.updateEvent,
        // eventClick: popMethods.popAdd,  //当点击预约事件时， 应该显示预约事件的详细内容
        eventClick: function (calEvent, jsEvent, view) {

            var id = calEvent.id;
            if (!id.startsWith('day')) { //如果点击天气，不跳转
                $(this).css('border-color', 'red');
                $(location).attr('href', '/reservation-add?id=' + id + '&update=' + 1);
                // $(location).attr('href', '/reservation-show?id=' + id + "&update=" + 0);
            }

        },
        // selectable: true,
        // selectHelper: true,
        // select: function (start, end, jsEvent, view) {
        //     popMethods.popAdd.call(this, {start: start, end: end}, jsEvent, view);
        // },
        // unselectCancel: '.bubble',
        // unselect: function () {
        //     popMethods.popClose();
        // },
        eventRender: function (event, element) { //Triggered while an event is being rendered.
            // prohibit change other people's reservation
            if (event.user && !isThisMan(event.user)) {
                event.editable = false;
            }

        },
        // loading: function () {
        // }
    });


    //设置是否是管理员页面
    function isAdaminPage() {
        console.log('user : ' + user);
        $.post('/account-check', {'user': user}, function (result) {

            console.log('result : ' + result.id);
            if (result.id == 1) {
                $('#manage-reservation').show();
            } else {
                $('#manage-reservation').hide();
            }
        });
    }

    //
    isAdaminPage();

    //点击预约管理
    $("#manage-reservation").click(function () {
        var user = $("#userUser").val();
        $(location).attr('href', '/reservation-manage?user=' + user);
    });


    roomIds = ['#room1', '#room2', '#room3', '#room4'];
    //清除选中的tap
    function clearAllMark() {
        for (i = 0; i < roomIds.length; i++) {
            $(roomIds[i]).attr('class', '');

        }
    }

    function setCurRoomMark() {
        clearAllMark();

        $(roomIds[Number(curRoomId - 1)]).attr('class', 'active');
    }

    setCurRoomMark();

    // $(document).ready(function () {

    //点击预约申请
    $("#make-reservation").click(function () {
        //跳转到添加页面
        $(location).attr('href', '/reservation-add?roomId=' + curRoomId + '&update=' + 3);
    });

    //点击我的预约
    $("#my-reservation").click(function () {
        var user = $("#userUser").val();
        $(location).attr('href', '/reservation-my?user=' + user);
    });

    $("#room1").click(function () {
        // loadReservation('1');
        // clearAllMark();
        // $("#room1").attr('class', 'active');
        curRoomId = '1';

        // 然后要重新加载预约列表，显示
        loadReservation(curRoomId);
    });


    $("#room2").click(function () {
        // clearAllMark();
        // $("#room2").attr('class', 'active');
        curRoomId = '2';
        loadReservation(curRoomId);
    });

    $("#room3").click(function () {
        // clearAllMark();
        // $("#room3").attr('class', 'active');
        curRoomId = '3';
        loadReservation(curRoomId);
    });

    $("#room4").click(function () {

        curRoomId = '4';
        loadReservation(curRoomId);
    });


    function loadReservation(curRoomdId) {
        window.location.href = '/reservation?roomId=' + curRoomdId;
        // calendar.fullCalendar('removeEvents');
        // console.log(" ------------ newEvent -----------  ", newEvents);
        // check.setOriginalEvents(newEvent);
        // calendar.fullCalendar( 'renderEvents', newEvent, true);
    }
});